/*
 * @Description: 异步导入导出记录表
 * @Author:
 * @Date: 2024-07-08 14:27:15
 * @LastEditors:
 * @LastEditTime: 2024-07-08 14:27:15
 */

import { defineComponent, reactive, ref, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { assign, cloneDeep } from 'lodash-es'
import { arraySerializeToStr } from '@/utils/arrayUtils'
import usePermission from '@/hooks/web/permission'
import { ImportExportModel, ImportExportPageParams } from '@/api/system/model/importExportModel'
import {
  apiImportExportLogicBatchDeleteByIds,
  apiImportExportSearch
} from '@/api/system/importExport'
import { useAppAuth, useNetworkConfig } from '@/hooks/setting'
import { useLoginUserStore } from '@/store/modules/loginUser'

export default defineComponent({
  name: 'ImportExport',
  components: {},
  setup(props, { expose }) {
    //////////////////////////////////////////////////
    // 属性
    //////////////////////////////////////////////////

    const loading = ref(false)
    const loadingByDel = ref(false)

    /**
     * 显示弹框
     */
    const visible = ref(false)

    /**
     * 标题
     */
    const title = ref('')

    // 权限控制
    const { hasPermission } = usePermission()

    /**
     * 表格数据
     */
    const tableData = ref()

    /**
     * 查询表单
     */
    const searchFormRef = ref()

    /**
     * 数据列表
     */
    const tableRef = ref()

    /**
     * 登录用户
     */
    const loginUserStore = useLoginUserStore()

    /**
     * 公共
     */
    const state = reactive({
      uploadUrl: `${useNetworkConfig.baseURL}/system/importExport/save`,
      headers: {
        'X-Token': loginUserStore.token,
        'X-AppId': useAppAuth.authId,
        'X-AppToken': useAppAuth.authToken,
        'X-AppSecret': useAppAuth.authSecret
      }
    })

    //////////////////////////////////////////////////
    // 查询表单
    //////////////////////////////////////////////////

    const defaultSearchForm = {
      queryLikeStr: '', // 模糊查询关键字
      creator: null, // 创建人
      updater: null, // 更新人
      createDate: null, // 创建时间
      updateDate: null, // 更新时间
      bizSys: null, // 业务系统
      bizType: null, // 业务类型（1-导入，2-导出）
      bizTypeKey: null, // 业务类型KEY
      bizTypeName: null, // 业务类型名称
      name: null, // 附件名称
      importName: null, // 导入文件名
      result: null, // 结果（1-执行中，2-执行完成）
      resultInfo: null, // 结果信息
      resultDate: null // 结果产生时间
    }

    /**
     * 查询表单
     */
    const searchForm = reactive(cloneDeep(defaultSearchForm))

    //////////////////////////////////////////////////
    // 函数
    //////////////////////////////////////////////////

    /**
     * 查询表格数据函数
     * @param queryParams
     */
    function searchList(queryParams: ImportExportPageParams) {
      loading.value = true
      const searchParams = assign(queryParams, searchForm)
      apiImportExportSearch(searchParams)
        .then((result) => {
          tableData.value = result
        })
        .catch(() => {})
        .finally(() => {
          loading.value = false
        })
    }

    /**
     * 查询表格数据
     */
    function handleSearch() {
      tableRef.value.handleQuery()
    }

    /**
     * 刷新
     */
    function handleRefresh() {
      tableRef.value.handleReload()
    }

    /**
     * 重置
     */
    function handleReset() {
      assign(searchForm, cloneDeep(defaultSearchForm))
      tableRef.value.handleQuery()
    }

    /**
     * 批量删除
     */
    function handleDelete(row?: ImportExportModel) {
      let selectRows: Array<ImportExportModel> = []

      if (row) {
        selectRows = [row]
      } else {
        selectRows = tableRef.value.getSelectRows()
      }

      if (selectRows.length === 0) {
        ElMessage.warning('请选择需要删除的数据')
        return
      }

      ElMessageBox.confirm(`此操作将删除${selectRows.length}条记录, 是否继续?`, '删除提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          loadingByDel.value = true
          const ids = arraySerializeToStr(selectRows, 'id')
          apiImportExportLogicBatchDeleteByIds(ids)
            .then((result) => {
              if (result?.success) {
                handleRefresh()
                ElMessage.success(result.message)
              } else {
                ElMessage.error(result?.message)
              }
            })
            .catch(() => {})
            .finally(() => {
              loadingByDel.value = false
            })
        })
        .catch(() => {
          ElMessage.info('删除被取消了')
        })
    }

    //////////////////////////////////////////////////
    // 弹框
    //////////////////////////////////////////////////
    /**
     * 打开弹框
     */
    function handleOpen(params: { title: string; bizTypeKey: string; bizTypeName: string }) {
      visible.value = true

      title.value = params.title
    }

    /**
     * 关闭弹框
     */
    function handleClose() {
      visible.value = false
    }

    //////////////////////////////////////////////////
    // 生命周期
    //////////////////////////////////////////////////
    onMounted(() => {})

    /**
     * 暴露函数
     */
    expose({ handleOpen })

    return {
      visible,
      title,
      loading,
      loadingByDel,
      tableData,
      searchFormRef,
      tableRef,
      state,
      searchForm,
      searchList,
      handleSearch,
      handleRefresh,
      handleReset,
      handleDelete,
      handleOpen,
      handleClose
    }
  }
})
